﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CapaPresentacion.Commands;
using CapaPresentacion.Vistas;
using Entidades;
using CapaLogica;
using System.Windows.Input;
using System.Windows;
using System.Windows.Data;

namespace CapaPresentacion.Controles
{
    class NuevoDiaFeriadoViewModel
    {

        public event ReiniciarCU ReiniciarCU;


        
        #region Variables
        
        private DiaFeriado diaFeriado;
        private DiaFeriado diaFeriadoSinModificaciones;
        private RelayCommand saveCommand;
        private RelayCommand newCommand;
        private RelayCommand openCommand;


        private NuevoDiaFeriado view;

        #endregion

        #region Propiedades
       

        public ICommand SaveCommand
        {
            get
            {
                return saveCommand;
            }
        }

        public ICommand OpenCommand
        {
            get
            {
                return openCommand;
            }
        }

        public ICommand NewCommand
        {
            get
            {
                return newCommand;
            }
        }

        public DiaFeriado DiaFeriado
        {
            get { return diaFeriado; }
            set { diaFeriado = value; }
        }

        #endregion

        #region Métodos


        public NuevoDiaFeriadoViewModel(NuevoDiaFeriado vista)
        {
            this.view = vista;
            this.diaFeriado = new DiaFeriado();

            this.diaFeriado.IdDiaFeriado = Guid.NewGuid();
            this.saveCommand = new RelayCommand(GuardarDiaFeriado);
            this.newCommand = new RelayCommand(oNuevoDiaFeriado);
            this.openCommand = new RelayCommand(AbrirDiaFeriado);

            this.diaFeriado.FechaFeriado = DateTime.Now;
        }

        public NuevoDiaFeriadoViewModel(NuevoDiaFeriado vista, DiaFeriado entidad)
        {
            this.view = vista;
            this.diaFeriado = entidad;
            this.diaFeriadoSinModificaciones = (DiaFeriado)entidad.Clone();
            this.saveCommand = new RelayCommand(GuardarDiaFeriado);
            this.newCommand = new RelayCommand(oNuevoDiaFeriado);
            this.openCommand = new RelayCommand(AbrirDiaFeriado);

        }


        private void oNuevoDiaFeriado(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea crear un nuevo día feriado?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.NuevoDiaFeriado);
            }
        }

        private void AbrirDiaFeriado(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea editar los datos de un día feriado existente?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                this.ReiniciarCU(CasosDeUso.BuscarDiaFeriado);
            }
        }


        private void GuardarDiaFeriado(Object parameter)
        {
            if (MessageBox.Show("¿Está seguro que desea guardar los datos?", "Confirme su Decisión", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
            {
                try
                {
                    if (Validaciones())
                    {
                        if (!new DiaFeriadoLogica().ExisteEntidad(this.diaFeriado.IdDiaFeriado)) // Nuevo dia feriado
                        {
                            new DiaFeriadoLogica().Agregar(this.diaFeriado);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "El día feriado ha sido creado correctamente");
                            nueva.ShowDialog();

                            this.ReiniciarCU(CasosDeUso.NuevoDiaFeriado);
                        }
                        else                        // Edición dia feriado
                        {

                            new DiaFeriadoLogica().Modificar(this.diaFeriado);

                            VentanaAviso nueva = new VentanaAviso(false, "Finalización Exitosa", "El día feriado ha sido modificado correctamente");
                            nueva.ShowDialog();

                            this.ReiniciarCU(CasosDeUso.NuevoDiaFeriado);

                        }

                    }
                }
                catch (Exception)
                {
                    VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "  Ha ocurrido un error y el día feriado no se ha guardado");
                    nueva.ShowDialog();

                }
               

            }

        }



        private bool Validaciones()
        {
            if (this.diaFeriado.FechaFeriado.ToShortDateString() == null || this.diaFeriado.FechaFeriado.ToShortDateString() == "01/01/0001")
            {

                if (diaFeriadoSinModificaciones != null)
                    this.diaFeriado.FechaFeriado = this.diaFeriadoSinModificaciones.FechaFeriado;


                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "Debe elegir la fecha del día feriado");
                nueva.ShowDialog();
                return false;
                
            }

            if (this.diaFeriado.DescripcionFeriado == null || this.diaFeriado.DescripcionFeriado == "")
            {
                if (diaFeriadoSinModificaciones != null)
                    this.diaFeriado.DescripcionFeriado = this.diaFeriadoSinModificaciones.DescripcionFeriado;

                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El campo 'Descripción del día feriado' no puede estar vacío");
                nueva.ShowDialog();
                return false;
            }

            if (new DiaFeriadoLogica().ExisteEntidad(this.diaFeriado))
            {
                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "El día feriado que intenta ingresar ya existe en el sistema");
                nueva.ShowDialog();
                return false;
            }

            if (new DiaFeriadoLogica().ExistenActividadesPlanificadas(this.diaFeriado))
            {
                VentanaAviso nueva = new VentanaAviso(true, "Se ha producido un error", "Existe una planificación didáctica que tiene actividades fijadas \n para el día en el que intenta cargar el feriado. Elimine primero las actividades.");
                nueva.ShowDialog();
                return false;
            }


            return true;

        }



        #endregion













    }
}
